﻿#ifndef BLOCKGROUPMOVE_H
#define BLOCKGROUPMOVE_H

#include "blockgroup.h"

/********************************************************
 * @ClassName:  BlockGroupMove
 * @Brief:      能够移动的方块组，接受玩家键盘操控
 * @date        2022/02/11
 ********************************************************/
class BlockGroupMove : public BlockGroup
{
    Q_OBJECT
public:
    explicit BlockGroupMove(const QPointF &point, QObject *parent = nullptr);

    void game_start();             // 游戏开始
    void game_pause(bool flag);    // 游戏暂停/继续
    void game_end();               // 游戏结束

    int speed() const;
    void setSpeed(int newSpeed);
    void copyShape(BlockGroup *another);    // 拷贝另一个方块组

    void setKeyPressEventEnable(bool flag);    // 设置使能键盘事件

signals:
    void game_over();          // 游戏结束
    void need_next_shape();    // 当前形状已触底
    void clear_full_rows();    // 消除满行

protected:
    virtual void keyPressEvent(QKeyEvent * event);
    virtual void focusOutEvent(QFocusEvent *event);

private:
    enum Direction {
        up = 0,
        down = 1,
        left = 2,
        right = 3,
    };

    int m_speed = 1;       // 速度（读取设置）
    QTimer *drop_timer;    // 掉落计时器
    QTimer *lock_timer;    // 锁定计时器
    void move_one_step(Direction direction);
    bool move_right();    // 右移一格
    bool move_left();     // 左移一格
    bool move_up();       // 上移一格
    bool move_down();     // 下移一格
    bool can_move_down();   //测试能否下落
    bool move_by_coord(int x, int y);   //根据坐标踢墙

    bool isKeyPressEventEnable = true;

    void shoot_add_ball();       // 发送填充弹
    void shoot_remove_ball();    // 发送消除弹
    void reset_lock_timer();     // 重置锁定计时器
    void rotation_whitout_kick_ARS(int degree);  //ARS旋转
    void rotation_ARS(int degree);  //ARS旋转，带踢墙
};

#endif // BLOCKGROUPMOVE_H
